import time
from DrissionPage import ChromiumPage
from ddddocr import DdddOcr

def slide_verification_crack(page, target_img_path, background_img_path):
    """破解滑块验证码"""
    # 初始化 ddddocr
    det = DdddOcr(det=False, ocr=False)

    # 读取滑块图片和背景图片（二进制模式）
    with open(target_img_path, 'rb') as f:
        target_bytes = f.read()
    with open(background_img_path, 'rb') as f:
        background_bytes = f.read()

    # 计算滑块在背景图中的位置
    res = det.slide_match(target_bytes, background_bytes)
    print("滑块匹配结果:", res)  # 调试输出

    # 提取滑块的目标 X 坐标（通常是滑块的偏移量）
    target_x = res['target'][0]  # 取 target 列表的第一个值（x1）

    # 使用 DrissionPage 操作页面
    # 假设滑块元素是 <div class="slider">，拖动按钮是 <div class="slider-button">
    slider = page.ele('.slider')          # 滑块轨道
    slider_button = page.ele('.slider-button')  # 滑块按钮

    # 模拟人类拖动：先快速移动，再微调
    page.actions.hold(slider_button).move(target_x, 0).wait(0.5).release().perform()

    # 等待验证完成（根据实际需求调整）
    time.sleep(2)

    # 检查是否验证成功（假设成功后会跳转或隐藏滑块）
    if not slider_button.is_displayed():
        print("滑块验证成功！")
    else:
        print("滑块验证失败！")

"""
1、图片获取：
如果验证码图片是动态的，可以用 DrissionPage 下载：
page.ele('img.target').save('target.png')  # 替换为实际图片元素选择器
2、滑块元素定位：
使用浏览器开发者工具（F12）检查滑块和按钮的 CSS 选择器或 XPath。
slider = page.ele('xpath://div[@class="slider"]')
1. 自动重试机制
max_retries = 3
for _ in range(max_retries):
    try:
        slide_verification_crack(page, 'target.png', 'background.png')
        break
    except Exception as e:
        print(f"尝试失败: {e}")
        time.sleep(1)
2、动态适配不同验证码        
# 根据网站实际结构动态获取图片
target_img = page.ele('img#target').get_src()  # 获取图片链接
background_img = page.ele('img#bg').get_src()
download_images(target_img, background_img)  # 自定义下载函数
"""

# 示例使用
if __name__ == '__main__':
    # 初始化 DrissionPage
    page = ChromiumPage()
    page.get('https://example.com/login')  # 替换为目标网站
    # 下载滑块图片和背景图（假设已手动保存为 target.png 和 background.png）
    # 如果图片是动态的，可以用 page.ele('img.target').save('target.png') 保存
    # 调用破解函数
    slide_verification_crack(page, 'target.png', 'background.png')